Books Online خود SQL Server معایب زیر را برای نوع داده Uniqueidentifier لیست می کند:
- مقادیر طولانی و مبهم هستند که تایپ توسط کاربر را دشوار می کند و همچنین حفظ کردن آن دشوار است.
- مقادیر تصادفی هستند و نمی توان به الگویی دست یافت که برای کاربر قابل معنی باشد.
- هیچ راهی برای تعیین دنباله مقادیر Uniqueidentifier وجود ندارد. برنامه هایی که ارزش افزایشی کلید مورد نیاز است قابل نیاز است، کاربرد ندارد.
- اندازه نوع داده uniqueidentifier بزرگتر از سایر انواع داده و 16 بایت است. بدیهی است که ایندکس های Uniqueidentifier کندتر از ایندکس های نوع int خواهند بود.
- اگر از تابع NEWID استفاده می کنید، GUID های تصادفی ایجاد می شود که دارای دامنه بزرگی است اما احتمال برخورد GUID ها وجود دارد. که برای اطمینان از عدم تکرار از تابع NewSequentialID استفاده می کنند. این تابع از شماره شناسایی کارت شبکه و شماره منحصر به فرد از ساعت CPU استفاده می کند که احتمال برخورد GUID تقریبا غیرممکن می شود.
برای بررسی کارایی، از مثالی با نوع داده های مختلف GUID و BIGINT و INT استفاده می کنیم؛ لذا از دستورات زیر برای ایجاد جداول استفاده می کنیم:
create table tblGUID (RecID uniqueidentifier default newid(), Record varchar(255), ModifiedTime datetime, SessionID int)
create table tblSeqGUID (RecID uniqueidentifier default newsequentialid(), Record varchar(255), ModifiedTime datetime, SessionID int)
create table tblINT (RecID bigint identity(1,1), Record varchar(255),ModifiedTime datetime, SessionID int)
create table tblBigINT (RecID int identity(1,1), Record varchar(255),ModifiedTime datetime, SessionID int)
create table tblSeqGUID (RecID uniqueidentifier default newsequentialid(), Record varchar(255), ModifiedTime datetime, SessionID int)
create table tblINT (RecID bigint identity(1,1), Record varchar(255),ModifiedTime datetime, SessionID int)
create table tblBigINT (RecID int identity(1,1), Record varchar(255),ModifiedTime datetime, SessionID int)
ایندکس Clustered برای هر 4 جدول فوق روی فیلد RecID می سازیم و سپس 1 میلیون رکورد در هر جدول Insert می کنیم. مدت زمان صرف شده برای ورود اطلاعات به شرح زیر است:
tblGUID: 22 seconds
tblSeqGUID: 16 seconds
tblBIGINT: 23 seconds
tblINT: 23 seconds
و همچنین وضعیت دیسک بصورت زیر خواهد بود:tblSeqGUID: 16 seconds
tblBIGINT: 23 seconds
tblINT: 23 seconds
Object Name | Index Name | Pages | Average Record Size | Extents | Average Page Density | Logical Fragmentation | Extent Fragmentation |
---|---|---|---|---|---|---|---|
tblGUID | cidx_tblGUID | 9608 | 51.89 | 1209.00 | 69.27 | 99.14 | 0.25 |
tblSeqGUID | cidx_tblSeqGUID | 6697 | 51.89 | 845.00 | 99.39 | 0.76 | 0.12 |
tblBigINT | cidx_tblBigINT | 5671 | 43.89 | 714.00 | 99.95 | 0.48 | 0.14 |
tblINT | cidx_tblINT | 5194 | 39.89 | 653.00 | 99.62 | 0.37 | 0.15 |
اگر به داده ها نگاه کنید، خواهید دید که GUID های تصادفی 99% fragmentation منطقی در جدول دارد که به دلیل ماهیت تصادفی تولید GUID هاست. ضمنا به دلیل نیاز به فضای بیشتر توسط GUID نسبت به INT تعداد صفحات جدول نیز بیشتر خواهد بود.
مجددا 10000 رکورد جدید Insert می کنیم؛ مدت زمان صرف شده برای ورود اطلاعات به شرح زیر است:
tblGuid : 23 seconds (10 ms to 1120 ms)
tblSeqGuid : 0 seconds (3 ms to 10 ms)
tblBigINT : 0 seconds (3 ms to 13 ms)
tblINT : 0 seconds (3 ms to 20 ms)
tblSeqGuid : 0 seconds (3 ms to 10 ms)
tblBigINT : 0 seconds (3 ms to 13 ms)
tblINT : 0 seconds (3 ms to 20 ms)
خلاصه نتیجه بصورت زیر است:
Criteria | GUIDs | Seq. GUIDs | BIGINT | INT |
---|---|---|---|---|
Storage | 16 bytes | 16 bytes | 8 bytes | 4 bytes |
Insert/Update performance | Slowest | Comparable but the index keys are larger in size. For wider tables, this would be slower than Integer values. | Faster than sequential GUIDs | Fastest |
Hotspot contention | Very rare | Yes | Yes | Highest, due to smaller size of RIDs |
Fragmentation/Page Splits | High | Minimal | Minimal | Minimal |
JOIN Performance/SORT operations | Least performance (Rank 4 = Least performance) | Better than random GUIDs due lesser fragmentation (Rank: 3) | High performance (Rank: 2) | High Performance (Rank: 1) |
Logical reads | Rank 4=Highest | Rank 3 | Rank 2 | Rank 1=Least |
Merging data across servers | Beneficial | Beneficial | Difficult | Difficult |
Uniqueness | Rare chance of duplicates | Globally unique. Virtually no chance of collisions | Limited by range of BIGINT | Limited by range of INT |
منبع: MSDN